import { transMenuToRouter } from '@/utils/router'
import { getLStorage } from '@/utils/web-storage'

import { RoutesStatic, RoutesLast, resetRouter } from '@/router'
import router from '@/router'

const state = {
  // 所有有权限，允许通过的路由数组，包括不需要权限判断的静态路由表
  accessedRoutesAll: [],
  // 所有有权限，允许通过的路由数组，不包括不需要权限判断的静态路由表
  accessedRoutesDynamic: [],
}

const mutations = {
  SET_ROUTES: (state, aryRoute) => {
    // concat() 方法用于连接两个或多个数组
    state.accessedRoutesAll = RoutesStatic.concat(aryRoute).concat(RoutesLast)
    state.accessedRoutesDynamic = aryRoute
  },
}

const actions = {
  /**
   * 1、从 LocalStorage 中获取 menu，然后将menu转成route数组
   * 2、将route数组存到store中
   * 3、返回保存了动态数组的store
   */
  setRoutesDynamic({ commit }) {
    // eslint-disable-next-line
    return new Promise(async (resolve) => {
      // 1、admin 登录成功后，后台同时返回了该管理员对应的菜单，并以json字符串格式存到 LocalStorage 中
      // 从 LocalStorage 中获取 menu 的json字符串
      const menuJson = getLStorage('MenuJson')
      if (!menuJson || menuJson === '') {
        router.push('/login')
      }
      let menuAry = JSON.parse(menuJson)
      menuAry = menuAry.sort(function (a, b) {
        return a.sort - b.sort
      })
      // 将 menu 的json字符串转换成 route
      const accessedRoutesDynamic = transMenuToRouter(menuAry)
      // 2、设置store中的动态数组变量
      commit('SET_ROUTES', accessedRoutesDynamic)
      // 3、返回添加了动态数组的所有可进入的 routes
      resolve(accessedRoutesDynamic)
    })
  },
  // 清除动态路由
  clearRoutesDynamic({ commit }) {
    // eslint-disable-next-line
    return new Promise(async (resolve) => {
      commit('SET_ROUTES', [])
      resetRouter()
      resolve()
    })
  },
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
